[ASAN] metalink: Fix leaks of buffer
authorColin Walters <walters@verbum.org>
Tue, 29 Nov 2016 03:01:33 +0000 (22:01 -0500)
committerAtomic Bot <atomic-devel@projectatomic.io>
Wed, 30 Nov 2016 18:51:26 +0000 (18:51 +0000)
We should be religious about the "only set output variables on
success", otherwise it makes leaks more likely.

But the real leak was us simply not using autoptr in one place.

Closes: #598
Approved by: jlebon

src/libostree/ostree-metalink.c

index ad3d5bf9406e1f2230362a19fd8956d5d553b624..b3c8b15a8adfd6947b7da6f8f0628d20aacc295d 100644 (file)
@@ -479,7 +479,7 @@ try_one_url (OstreeMetalinkRequest *self,
 
   ret = TRUE;
   if (out_data)
-    *out_data = g_bytes_ref (bytes);
+    *out_data = g_steal_pointer (&bytes);
  out:
   return ret;
 }
@@ -492,6 +492,7 @@ try_metalink_targets (OstreeMetalinkRequest      *self,
 {
   gboolean ret = FALSE;
   SoupURI *target_uri = NULL;
+  g_autoptr(GBytes) ret_data = NULL;
 
   if (!self->found_a_file_element)
     {
@@ -546,7 +547,7 @@ try_metalink_targets (OstreeMetalinkRequest      *self,
 
       target_uri = self->urls->pdata[self->current_url_index];
       
-      if (try_one_url (self, target_uri, out_data, &temp_error))
+      if (try_one_url (self, target_uri, &ret_data, &temp_error))
         break;
       else
         {
@@ -568,6 +569,8 @@ try_metalink_targets (OstreeMetalinkRequest      *self,
   ret = TRUE;
   if (out_target_uri)
     *out_target_uri = soup_uri_copy (target_uri);
+  if (out_data)
+    *out_data = g_steal_pointer (&ret_data);
  out:
   return ret;
 }
@@ -599,7 +602,7 @@ _ostree_metalink_request_sync (OstreeMetalink        *self,
   gboolean ret = FALSE;
   OstreeMetalinkRequest request = { 0, };
   g_autoptr(GMainContext) mainctx = NULL;
-  GBytes *out_contents = NULL;
+  g_autoptr(GBytes) contents = NULL;
   gsize len;
   const guint8 *data;
 
@@ -614,13 +617,13 @@ _ostree_metalink_request_sync (OstreeMetalink        *self,
                                               self->uri,
                                               FALSE,
                                               FALSE,
-                                              &out_contents,
+                                              &contents,
                                               self->max_size,
                                               cancellable,
                                               error))
     goto out;
 
-  data = g_bytes_get_data (out_contents, &len);
+  data = g_bytes_get_data (contents, &len);
   if (!g_markup_parse_context_parse (request.parser, (const char*)data, len, error))
     goto out;